#ifndef CAMERA_H
#define CAMERA_H
/*!
 * \file cammanager.h
 * \brief
 * \version 1.0
 */
#include <QThread>
#include <string>
#include <QLabel>
#include <QSize>
#include <QTimer>
#include <QTime>
#include <QDebug>
#include <record.h>
#include <opencv2/opencv.hpp>

/*! \namespace cv
 *
 * espace de nommage regroupant les fonctionnalites de opencv,
 * notamment sur les traitement d'images.
 *
 */
using namespace cv;
/**
 * \brief Gestion de caméra
 * \version 1.0
 * Classe pour capter des frames d'une camera
 */
class CamManager : public QThread
{
    Q_OBJECT
private:
    QSize imageSize;
    CvCapture *camera;
    IplImage *cvimage;

    bool inRefresh;

    QList<ImageConsumer*> cons;
    QList<int> busyConsList;

    QTimer *timer;
    QTime refreshTime;

private slots:
    /*!
     *  \fn void refresh();
     *  \brief Fonction de rafraichissement
     *  Fonction executer toutes les 30ms pour capter des frames de camera en continu
     */
    void refresh();

public:
    /*!
     *  \fn CamManager(QSize size)
     *  \brief Constucteur
     *  Constructeur qui initialise CvCapture pour gerer la camera
     *  \param size : resolution des frames a captees
     */
    CamManager(QSize const size);
    /*!
     *  \fn ~CamManager()
     *  \brief Destructeur
     */
    ~CamManager();
    /*!
     *  \fn void run()
     *  \brief Lance le thread
     *  Capte regulierement une frame de la camera et la distribue à tous les consommateurs
     */
    void run();
    /*!
     *  \fn void registerConsumer(ImageConsumer *consumer)
     *  \brief Enregistre consommateur
     *  Enregistrement d'un consommateur qui va recevoir des images regulierement
     */
    void registerConsumer(ImageConsumer * const consumer);
    /*!
     *  \fn void removeConsumer(ImageConsumer *consumer)
     *  \brief Enleve consommateur
     *  Enleve l'enregistrement d'un consommateur qui ne recevra plus d'images
     */
    void removeConsumer(ImageConsumer * const consumer);

signals:
    /**
      * \fn void stopSignal()
      * \brief signal de fermeture
      * Signal envoyer pour stopper le timer lance par run()
      */
    void stopSignal();

public slots:
    /*!
     *  \fn void terminate()
     *  \brief Arret du thread
     *  Surcharge de terminate pour arreter le thread proprement
     */
    void terminate();
};

#endif // CAMERA_H
